package org.helian.interceptor;

import org.helian.controller.UserController;
import org.helian.pojo.TbUser;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * @Description 过滤器
 * @Author 墨染
 * @Date 2020/11/7 17:53
 * @Version 1.0
 */
@Component //把这个类交给spring管理
public class LoginInterceptor implements HandlerInterceptor {

    /**
     * 方法执行之前，先去过滤（主用这个）
     * <p>
     * 预处理回调方法，实现处理器的预处理（如检查登陆），第三个参数为响应的处理器，自定义Controller
     * 返回值：true表示继续流程（如调用下一个拦截器或处理器）；
     * false表示流程中断（如登录检查失败），不会继续调用其他的拦截器或处理器，此时我们需要通过response来产生响应；
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        //设置request，response字符集，否则输出的script会乱码
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        TbUser user = (TbUser) request.getSession().getAttribute("user");
        if (user != null) {
            String userId = String.valueOf(user.getId());
            HttpSession httpSession = UserController.sessionMap.get(userId);
            if (httpSession != null) {
                //异地登录
                if (!httpSession.getId().equals(request.getSession().getId())) {
                    //跳转至登录页面
                    response.getWriter().println(
                            "<script type='text/javascript'>"
                                    + "alert('您的账号已在异地登录，请重新登录!'); "
                                    + "top.location.href='"
                                    + request.getContextPath() + "/user/toLogin" + "';</script>"); //注销删session的跳转登录界面方法
                    return false;
                }
            } else {
                //跳转至登录页面
                response.getWriter().println(
                        "<script type='text/javascript'>"
                                + "alert('尚未登录或者登录超时，请重新登录!!'); "
                                + "top.location.href='"
                                + request.getContextPath() + "/user/loginPage" + "';</script>"); //不用注销删session的跳转登录界面方法
                return false;
            }
        } else {
            //跳转至登录页面
            response.getWriter().println(
                    "<script type='text/javascript'>"
                            + "alert('尚未登录或者登录超时，请重新登录!!'); "
                            + "top.location.href='"
                            + request.getContextPath() + "/user/loginPage" + "';</script>"); //不用注销删session的跳转登录界面方法
            return false;
        }
        return true;
    }

    /***
     * 方法执行中去过滤（用不到）
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }

    /***
     * 方法执行完毕之后，再去过滤（用不到）
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}
